/***********************************************************************************************************************
*Copyright (C), 2018,
* All rights reserved.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
*File Name:  irqhandler.c
*Version:    V0.7
*Device(s):  HR8P506FHLQ
*Description  :  This file implements time function.
*Creation Date:
*Code writer: wenjiqing
***********************************************************************************************************************/
#include "es8h018x_it.h"
#include "es8h018x.h"
#include "lib_config.h"
#include "OS_Kernel.h"
#include "Hardware_Uart.h"
#include "Debug.h"
#include "Shell.h"
#include "Serial.h"
#include "Buzzer.h"

void NMI_IRQHandler(void)
{

}

void HardFault_IRQHandler(void)
{
    while(1)
    {
		
    }
}

void SVC_IRQHandler(void)
{

}

void PendSV_IRQHandler(void)
{

}

void SysTick_IRQHandler(void)
{
    // 更新系统节拍
    OS_UpdateSysTick();
    
    // 蜂鸣器定时回调
    Buzzer_TimingHandler();
}

void IWDT_IRQHandler(void)
{

}

void T16N2_IRQHandler(void)
{

}

/*********************************************************
  * 函数名: UART0_IRQHandler
  * 描  述: UART0中断服务程序
  * 输入值: 无
  * 输出值: 无
  * 返回值: 显示板与控制板通信接口2 - 右控制板
**********************************************************/
void UART0_IRQHandler(void)
{
    // 发送中断
    if((UART_GetITStatus(UART0, UART_IT_TB) != RESET)
        && (UART_GetFlagStatus(UART0, UART_FLAG_TB) != RESET))
    {
        SerialSendEndIRQHook(SERIAL_BOARD_CHN2);
    }
    
    // 接收中断
    if((UART_GetFlagStatus(UART0, UART_FLAG_RB) != RESET)
        && UART_GetITStatus(UART0, UART_IT_RB) != RESET)
    {
        // 接收当前字符
        U8 u8Char = Hardware_UART0RecvByte();
        
        // 写入接收缓冲区
        SerialRecvData(SERIAL_BOARD_CHN2,&u8Char,1);
    }
}

/*********************************************************
  * 函数名: UART3_IRQHandler
  * 描  述: UART3中断服务程序
  * 输入值: 无
  * 输出值: 无
  * 返回值: 显示板与控制板通信接口1 - 左控制板
**********************************************************/
void UART3_IRQHandler(void)
{
    // 发送中断
    if((UART_GetITStatus(UART3, UART_IT_TB) != RESET)
        && (UART_GetFlagStatus(UART3, UART_FLAG_TB) != RESET))
    {
        SerialSendEndIRQHook(SERIAL_BOARD_CHN1);
    }
    
    // 接收中断
    if((UART_GetFlagStatus(UART3, UART_FLAG_RB) != RESET)
        && UART_GetITStatus(UART3, UART_IT_RB) != RESET)
    {
        // 接收当前字符
        U8 u8Char = Hardware_UART3RecvByte();
        
        // 写入接收缓冲区
        SerialRecvData(SERIAL_BOARD_CHN1,&u8Char,1);
    }
}

/*********************************************************
  * 函数名: UART4_IRQHandler
  * 描  述: UART4中断服务程序
  * 输入值: 无
  * 输出值: 无
  * 返回值: Touchkey通讯口
**********************************************************/
void UART4_IRQHandler(void)
{
    // 发送中断
    if((UART_GetITStatus(UART4, UART_IT_TB) != RESET)
        && (UART_GetFlagStatus(UART4, UART_FLAG_TB) != RESET))
    {
        // 发送中断处理 - 这个是干什么的呢 ？ 
        SerialSendEndIRQHook(SERIAL_TOUCH_KEY_CHN);
    }
    
    // UART4 接收中断
    if((UART_GetFlagStatus(UART4, UART_FLAG_RB) != RESET)
        && UART_GetITStatus(UART4, UART_IT_RB) != RESET)
    {
        // 字符备份
        static U8 u8CharBak;        
        
        // 接收当前字符
        U8 u8Char = Hardware_UART4RecvByte();
        
        if(((u8Char == 0xE0) || (u8Char == 0xE1) || (u8Char == 0xE2) || (u8Char == 0xE3)) && u8CharBak == 0xE0)
        {
            // 冗余字符不写入缓冲区
            
        }
        else
        {
            // 将上次的数据写入串口接收缓冲区
            SerialRecvData(SERIAL_TOUCH_KEY_CHN,&u8CharBak,sizeof(u8CharBak));
        }
        
        // 记录备份数据
        u8CharBak = u8Char;
    }
}

/*********************************************************
  * 函数名: UART5_IRQHandler
  * 描  述: UART5中断服务程序
  * 输入值: 无
  * 输出值: 无
  * 返回值: wifi/debug通讯口
**********************************************************/
void UART5_IRQHandler(void)
{
    // UART5 接收中断
    if(UART_GetFlagStatus(UART5, UART_FLAG_RB) != RESET && UART_GetITStatus(UART5, UART_IT_RB) != RESET)
    {
        unsigned char data = Hardware_UART5RecvByte();
#if CONFIG_SHELL
        Shell_RecvChr(data);
#endif
    }
    
    // UART5发送中断
    if(UART_GetFlagStatus(UART5, UART_FLAG_TB) != RESET && UART_GetITStatus(UART5, UART_IT_TB) != RESET)
    {
#if CONFIG_DEBUG
        printk_handler();
#endif
    }
}
